package net.minecraftforge.lex.fffixer; import java.io.PrintWriter; import java.io.StringWriter; import java.util.logging.FileHandler; import java.util.logging.Formatter; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; import joptsimple.OptionException; import joptsimple.OptionParser; import joptsimple.OptionSet; public class FFFixer { private final static Logger log = Logger.getLogger("FFFixer"); public static final String VERSION = "FernFlowerFixer v1.0 by LexManos (Basic structure from MCInjector)"; public static void main(String[] args) throws Exception { OptionParser parser = new OptionParser(); parser.accepts("help").forHelp(); parser.accepts("version").forHelp(); parser.accepts("jarIn").withRequiredArg().required(); parser.accepts("jarOut").withRequiredArg(); parser.accepts("log").withRequiredArg(); try { OptionSet options = parser.parse(args); if (options.has("help")) { System.out.println(VERSION); parser.printHelpOn(System.out); return; } else if (options.has("version")) { System.out.println(VERSION); return; } String jarIn = (String)options.valueOf("jarIn"); String jarOut = (String)options.valueOf("jarOut"); String log = (String)options.valueOf("log"); FFFixer.log.setUseParentHandlers(false); FFFixer.log.setLevel(Level.ALL); if (log != null) { FileHandler filehandler = new FileHandler(log); filehandler.setFormatter(new Formatter() { @Override public synchronized String format(LogRecord record) { StringBuffer sb = new StringBuffer(); String message = this.formatMessage(record); sb.append(record.getLevel().getName()); sb.append(": "); sb.append(message); sb.append("\n"); if (record.getThrown() != null) { try { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); record.getThrown().printStackTrace(pw); pw.close(); sb.append(sw.toString()); } catch (Exception ex){} } return sb.toString(); } }); FFFixer.log.addHandler(filehandler); } FFFixer.log.addHandler(new Handler() { @Override public void publish(LogRecord record) { if (record.getLevel().intValue() < Level.INFO.intValue()) return; System.out.println(String.format(record.getMessage(), record.getParameters())); } @Override public void flush() {} @Override public void close() throws SecurityException {} }); log(FFFixer.VERSION); log("Input: " + jarIn); log("Output: " + jarOut); log("Log: " + log); try { FFFixerImpl.process(jarIn, jarOut, log); } catch (Exception e) { System.err.println("ERROR: " + e.getMessage()); e.printStackTrace(); System.exit(1); } } catch (OptionException e) { parser.printHelpOn(System.out); e.printStackTrace(); } } private static void log(String line) { log.info(line); } }